package week_02;

/**
 * 23. 合并K个升序链表
 * 给你一个链表数组，每个链表都已经按升序排列。
 * <p>
 * 请你将所有链表合并到一个升序链表中，返回合并后的链表。
 * <p>
 * 示例 1：
 * <p>
 * 输入：lists = [[1,4,5],[1,3,4],[2,6]]
 * 输出：[1,1,2,3,4,4,5,6]
 * 解释：链表数组如下：
 * [
 * 1->4->5,
 * 1->3->4,
 * 2->6
 * ]
 * 将它们合并到一个有序链表中得到。
 * 1->1->2->3->4->4->5->6
 * 示例 2：
 * <p>
 * 输入：lists = []
 * 输出：[]
 * 示例 3：
 * <p>
 * 输入：lists = [[]]
 * 输出：[]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/merge-k-sorted-lists
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

public class MergeKASCLists_23 {
    private ListNode[] lists;


    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length==0) return null;
        this.lists = lists;
        return mergeList(0, lists.length - 1);
    }

    private ListNode mergeTwoList(ListNode l1, ListNode l2) {
        ListNode root = new ListNode();
        ListNode cur = root;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                l1 = l1.next;
            } else {
                cur.next = l2;
                l2 = l2.next;
            }
            cur=cur.next;
        }
        if (l1 != null) {
            cur.next = l1;
        }
        if (l2 != null) {
            cur.next = l2;
        }
        return root.next;
    }

    private ListNode mergeList(int l, int r) {
        if (l == r) return lists[l];
        if (l + 1 == r) return mergeTwoList(lists[l], lists[r]);
        int mid = (l + (r - l) / 2);
        System.out.println("l::"+l+"::mid::"+mid+"::r::"+r);
        ListNode l1 = mergeList(l, mid);
        ListNode l2 = mergeList(mid + 1, r);

        return mergeTwoList(l1, l2);
    }
}
